# _*_ coding: UTF-8 _*_
# @Time     : 2021/2/24 下午 04:17
# @Author   : Li Jie
# @Site     : http://www.hzdledu.com/
# @File     : prac1.py
# @Software : PyCharm

from multiprocessing import Process, Queue, Pool, Manager
import time


# 1.生成日志与读取日志
# 编写一个程序，模拟生成10个日志文件（随意写入一些内容），然后创建4个进程分别读取这些文件，结果保存到total.txt

# 读取文件函数
def read_file(queue, filename=''):
    print(f'开始读取文件{filename}...')
    if filename:
        with open(filename, encoding='utf8') as file:
            data = file.read()  # 读取整个文件的内容到data
        queue.put(data, True)  # 将读取的数据放入队列
        print(f'文件{filename}读取完成...')


# 写入文件函数
def write_file(queue, filename=''):
    print(f'开始写入文件{filename}...')
    if filename:
        with open(filename, mode='w+', encoding='utf8') as file:  # 以追加写入方式打开文件
            while not queue.empty():
                data = queue.get(True, 2)  # 从队列取出数据
                file.write(data)  # 将数据写入文件
        print(f'文件{filename}写入完成...')


def process_main():
    print('-----------主进程开始------------')
    start_time = time.time()  # 开始计时
    pool = Pool(4)  # 创建读取的进程池，4个进程
    # queue = Queue()
    queue = Manager().Queue()  # 进程池的进程间通信要使用Manager类的Manager().Queue()，不能用Queue类的Queue()生成
    for i in range(1, 11):  # 循环10次
        filename = f'./file/{i}.txt'  # 生成文件路径
        pool.apply_async(read_file, args=(queue, filename))  # 非阻塞调用read_file()函数
        # print(f'进程{i}创建成功，读取文件{filename}')
    process_write = Process(target=write_file, args=(queue, './file/total.txt'))  # 创建写入进程
    pool.close()  # 关闭进程池
    pool.join()  # 等待进程池的子进程技术
    process_write.start()  # 启动写入进程
    process_write.join()  # 等待写入进程结束
    end_time = time.time()  # 结束计时
    print('-----------主进程结束------------')
    print(f'总共耗时:{end_time - start_time}秒')  # 计算耗时


if __name__ == '__main__':
    process_main()
